package cn.le.netty.server.handler;

import cn.le.netty.beans.Member;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;

import java.nio.charset.Charset;

/**
 * 处理echo的操作方式,其中ChannelInboundHandlerAdapter是针对数据输入的处理 netty是基于nio的一种开发框架的封装,这里面和aio是没有任何关系
 */
public class EchoServerHandler extends ChannelInboundHandlerAdapter {

  @Override
  public void channelActive(ChannelHandlerContext ctx) throws Exception {
    //当客户端链接成功之后会进行此方法的调用,明确可以给客户端发送一些消息
    //byte[] data = "[服务器激活信息] 链接通道已创建,服务器开始进行响应交互".getBytes();
    //nio 是基于缓存交互的操作,所以netty也提供了一系列的缓存类(封装了nio中的buffer)
    //ByteBuf buf = Unpooled.buffer(data.length);
    //buf.writeBytes(data); //将数据发送到缓存之中
    String data = "[服务器激活信息] 链接通道已创建,服务器开始进行响应交互" + System.getProperty("line.separator");
    System.out.println(data);
    //ctx.writeAndFlush(data); //强制性发送所有消息
  }

  /* public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
       try {
           //表示要进行数据信息的读取操作,对于读取操作完成之后也可以直接回应
           //对于客户端发送来的数据信息,由于没有进行制定的数据类型,所以都统一安装object进行接收
           ByteBuf buf = (ByteBuf) msg;//默认情况下的类型就是bytebuf类型
           //在进行客户端数据类型的转换的过程之中还可以进行编码制定
           String inputData = buf.toString(CharsetUtil.UTF_8);//将缓冲区的数据转成字符串
           String echoData = "[ECHO] " + inputData;//将数据回应处理
           //exit是客户端发送来的内容,可以理解为客户端的编码,儿quit描述的是一个客户端的结束
           if ("exit".equalsIgnoreCase(inputData)) {
               echoData = "quit";//结束当期交互
           }
           byte[] data = echoData.getBytes();//将字符串变为字节数据
           ByteBuf echoBuf = Unpooled.buffer(data.length);
           echoBuf.writeBytes(data);
           ctx.writeAndFlush(echoBuf);
       }finally {
           ReferenceCountUtil.release(msg);//释放缓存
       }
   }*/
   /*@Override
   public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
       String inputDate = msg.toString().trim();
       String  echoData = "[ECHO] " + inputDate + System.getProperty("line.separator");//将数据回应处理
       try {
           if ("exit".equalsIgnoreCase(inputDate)) {
               echoData = "quit";//结束当期交互
           }
           ctx.writeAndFlush(echoData);
       }finally {
            ReferenceCountUtil.release(msg);//释放缓存
        }
   }*/
  @Override
  public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    Member member = (Member) msg;
    member.setName("[ECHO] " + member.getName());
    System.out.println("服务器响应消息");
    try {
      ctx.writeAndFlush(member);
    } finally {
      ReferenceCountUtil.release(msg);//释放缓存
    }
  }

  /**
   * 异常数据
   *
   * @param cause 异常信息
   */
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    cause.printStackTrace();
    ctx.close();
  }
}
